
package com.monlyu.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;

import com.monlyu.bean.CommentBean;

/**
 * 数据库相关操作的类
 * 
 * @since 2009-12-23
 * @author monlyu
 */
public interface Dao {

    /**
     * 获取SQL执行的查询
     */
    public SqlDao getSqlDao();

    /**
     * 插入数据库
     * 
     * @param entities
     *            可以为一个对象,也可以为多个对象
     */
    public void insertOrUpdate(final Object entities);

    /**
     * 从数据中删除对象,可以为一个也可以为多个对象多集合
     * 
     * @param entities
     *            一个也可以为多个对象多集合
     */
    public void delete(final Object entities);

    /**
     * 通过Vo的ID来删除某个对象
     * 
     * @param entity
     *            需要删除的实体对象类
     * @param id
     *            该对象的Id值
     */
    public <T> void delete(final Class<T> entity, final Serializable id);

    /**
     * 对传入的对象进行更新操作
     * 
     * @param entities
     *            一个对象或者多个对象
     */
    public void update(final Object entities);

    /**
     * 根据对象和ID获取某个对象
     * 
     * @param clazz
     *            <T>
     * @param id
     * @return 获取id对应的对象,没有则返回<code>null</code>.
     */
    public <T> T get(final Class<T> clazz, final Serializable id);

    /**
     * 根据Id将数据库中的记录映射成对象objVo
     * 
     * @param objVo
     * @param id
     */
    public void load(final Object objVo, final Serializable id);

    /**
     * 根据Vo类把对象加载出来
     */
    public void load(final Object vo);

    /**
     * 执行Hql语句,返回影响的条数
     * 
     * @param hql
     * @param args
     */
    public int execute(final String hql, final Object... args);

    /**
     * 根据Hql加载所有的查出来的对象
     * 
     * @param hql
     * @param args
     */
    @SuppressWarnings("unchecked")
    public List find(final String hql, final Object... args);

    /**
     * 查找某个表的所有记录
     */
    public <T> List<T> find(Class<T> clazz);

    /**
     * 根据某个对象的某个属性,查处所有对象
     * 
     * @param clazz
     *            查询多实体对象
     * @param property
     *            属性名
     * @param value
     *            值
     */
    public <T> List<T> find(final Class<T> clazz, final String property, final Object value);

    /**
     * 根据hql加载出来第一个对象
     * 
     * @param hql
     * @param args
     */
    public Object findOne(final String hql, final Object... args);

    /**
     * 根据对象的属性查询一个对象
     * 
     * @param clazz
     *            类型
     * @param property
     *            属性
     * @param value
     *            值
     */
    public <T> T findOne(final Class<T> clazz, final String property, final Object value);

    /**
     * 查找固定的几条记录
     * 
     * @param limit
     *            记录数
     * @param hql
     *            hql语句
     * @param args
     *            参数
     * @return 需要查询多结果
     */
    public List<?> findLimit(int limit, final String hql, final Object... args);

    /**
     * 根据某个类型的 某个属性查询出限定的几条
     * 
     * @param limit
     *            条数
     * @param clazz
     *            类
     * @param property
     *            属性
     * @param value
     *            值
     */
    public <T> List<T> findLimit(int limit, final Class<T> clazz, final String property, final Object value);

    /**
     * 把Id赋值给实体对象
     * 
     * @param entity
     * @param id
     */
    public void setId(Object entity, Serializable id);

    /**
     * 获取实体的ID值
     * 
     * @param entity
     */
    public Serializable getId(final Object entity);

    /**
     * 刷新Hibernate的session缓存
     */
    public void clear();

    /**
     * 返回Criteria对象
     * 
     * @param clazz
     *            需要创建Criteria的类
     * @return 创建好了的Criteria
     */
    public Criteria initCriteria(Class<?> clazz);

    /**
     * 初始化数据的时候作判断,如果是数据库中没有则插入.有则更新.
     * 
     * @since 2009-12-30
     */
    public void initData(Object entities);

    /** 添加备注 */
    public void addComment(List<CommentBean> addComment2Table);

    /**
     * 保存双主键形式的对象
     */
    public void save2key(Object obj);

    /**
     * 根据Critaia获取总行数
     * 
     * @since 2010-2-11
     */
    public Integer countRow(Criteria criteria);

    // 更具ID获取对应的对象
    public <T> List<T> get(Class<T> clz, String id, List<Long> mid);
}
